package com.itheima.ai.controller;

import com.itheima.ai.repository.ChatHistoryRepository;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;

/**
 * ChatController类用于处理与AI聊天相关的HTTP请求。
 * 该类通过REST API提供聊天功能，并支持会话管理。
 */
@RestController
@RequestMapping("/ai")
@RequiredArgsConstructor
public class ChatController {

    // 用于与AI模型进行交互的ChatClient实例
    private final ChatClient chatClient;

    // 用于保存聊天历史记录的ChatHistoryRepository实例
    private final ChatHistoryRepository chatHistoryRepository;

    // 日志记录器，用于记录调试和错误信息
    private static final Logger logger = LoggerFactory.getLogger(ChatController.class);

    /**
     * 处理聊天请求的API端点。
     *
     * @param prompt 用户输入的聊天内容
     * @param chatId 当前聊天会话的唯一标识符
     * @return 返回一个Flux<String>，表示AI模型的响应流
     */
    @RequestMapping(value = "/chat", produces = "text/html;charset=utf-8")
    public Flux<String> chat(String prompt, String chatId) {
        try {
            // 1. 保存会话ID到聊天历史记录中
            logger.info("Saving chat session with ID: {}", chatId);
            chatHistoryRepository.save("chat", chatId);

            // 2. 向AI模型发送请求，并返回响应流
            logger.info("Requesting model with prompt: {}", prompt);
            return chatClient.prompt()
                    .user(prompt)  // 设置用户输入的内容
                    .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId))  // 设置会话ID
                    .stream()  // 获取响应流
                    .content();  // 提取响应内容
        } catch (Exception e) {
            // 捕获并记录异常，然后重新抛出
            logger.error("Error occurred during chat processing", e);
            throw new RuntimeException("Failed to process chat request", e);
        }
    }
}